package com.wisely.highlight_springmvc4.advice;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author GY
 * 2018年1月30日
 * 通过@ControllerAdvice
 * 我们可以将对于控制器的全局配置放置在同一个位置
 */
@ControllerAdvice //1
public class ExceptionHandlerAdvice {

	/**
	 * @param exception
	 * @param request
	 * @return
	 * GY
	 * 2018年1月30日
	 * 用户全局处理控制器里的异常
	 */
	@ExceptionHandler(value = Exception.class)//2
	public ModelAndView exception(Exception exception, WebRequest request) {
		ModelAndView modelAndView = new ModelAndView("error");// error页面
		modelAndView.addObject("errorMessage", exception.getMessage());
		return modelAndView;
	}

	/**
	 * @param model
	 * GY
	 * 2018年1月30日
	 * 绑定键值对到Model里
	 * 此处是让全局的@RequestMapping方法中都能获取此处设置的键值对
	 */
	@ModelAttribute //3
	public void addAttributes(Model model) {
		model.addAttribute("msg", "额外信息"); //3
	}

	/**
	 * @param webDataBinder
	 * GY
	 * 2018年1月30日
	 * 设置webDataBinder
	 * 用来自动绑定前台请求参数到Model中
	 * id被过滤掉
	 */
	@InitBinder //4
	public void initBinder(WebDataBinder webDataBinder) {
		webDataBinder.setDisallowedFields("id"); //5
	}
}
